
#include <stdio.h>
#include "cmsis_os2.h"                          // CMSIS RTOS header file
 
/*----------------------------------------------------------------------------
 *      Thread 1 'Thread_Name': Sample thread
 
 不在Thread_Disp()驱动DAC，因为显示频率低。更新DAC需要和ADC同步（同频率）。
 X名字：仿照Linux显示的X系统。
 *---------------------------------------------------------------------------*/
#include "dbgUart/dbgUart.h" 
#include "bsp.h"
#include "key.h"
#include "menu_seg.h"
#include "threads.h"
#include "parameter.h"
#include "preset_point.h"
#include "drv_ch423s.h"


static void x_disp_pwr(void);

static void disp_X(void);

/*菜单项目
*/ 
void Thread_X (void *argument);                   // thread function
 

int Init_Thread_X (void) {
	osThreadId_t tid_Thread;                        // thread id
	
	const osThreadAttr_t attr={.priority= osPriorityNormal2,.stack_size= 512};	// thread id 
	tid_Thread = osThreadNew(Thread_X, NULL, &attr);
	if (tid_Thread == NULL) {
		return(-1);
	}
 
	return(0);
}


//extern int32_t offset_disp;		//显示时的偏移量。



__NO_RETURN void Thread_X (void *argument) {
	(void)argument;	//Prevent unused argument(s) compilation warning.
	
	char str[32];
	int32_t wt;
	osStatus_t ret;
	uint16_t key;				//从消息队列中获取的按键值。
	MSG_U msg;					//组合消息
	
	
	ch423s_init();
	
	for(int i= 0; i< 8; i++)
		disp_x.data_nc[i]= disp_x.data[i]= 0x0;
	
	disp_x.data_nc[7]= LED_ALL>>8;	//更新指示灯对应的寄存器。
	disp_x.data_nc[6]= LED_ALL;
	
	uartS("\nThread_X(N2) start...\n");
	
	
	x_disp_pwr();
	
	
	
	
	
//	//test
//	x_seg_flash_all(1);
//	
//	x_led_one_flash(0, DISP_X_MODE_FF);
//	x_led_one_flash(1, DISP_X_MODE_LF);
//	x_led_one_flash(2, DISP_X_MODE_LF);
//	x_led_one_flash(3, DISP_X_MODE_FF);
//	x_led_one_flash(4, DISP_X_MODE_FF);
//	x_led_one_flash(5, DISP_X_MODE_LF);
//	x_led_one_flash(6, DISP_X_MODE_FF);
//	x_led_one_flash(7, DISP_X_MODE_LF);
//	x_led_one_flash(8, DISP_X_MODE_LF);
	
	while(1){
//		//每3秒，初始化一下，以解决MCU在2.xV运行，而CH423S在2.9V运行，造成MCU未对CH423S初始化成功。准备作废，已通过修改BOR_LVE[2:0]@FLASH_OPTR为100解决。
//		if(5*1000< ts_del_o_n(ts, ts_get())){
//			ts= ts_get();
//			ch423s_init();
//			uartS("&");
//		}
		
		
		/*6个数码管:
		i= 0: 左起第1个数码管
		...
		i= 5: 第6个数码管（最右的数码管）。
		*/
		for(int i=0; i< 6; i++){
			if(DISP_X_MODE_ON == disp_x.mode[i]){			//常亮（正常）
				disp_x.sta[i]= 0;
				disp_x.data[i]= disp_x.data_nc[i];		//需由.data_nc[]替代，因为.data[]可能为' '空了。
			}
			else if(DISP_X_MODE_OFF == disp_x.mode[i]){		//常灭		
				disp_x.data[i]= char_to_disp(' ');	
			}
			else if(DISP_X_MODE_FF == disp_x.mode[i]){		//快闪
				if(disp_x.sta[i]){
					disp_x.data[i]= char_to_disp(' ');
				}
				else{
					disp_x.data[i]= disp_x.data_nc[i];	//恢复之前的值
				}
			}
			else if(DISP_X_MODE_LF == disp_x.mode[i]){		//慢闪
				if(disp_x.sta[i]){
					disp_x.data[i]= char_to_disp(' ');
				}
				else{
					disp_x.data[i]= disp_x.data_nc[i];	//恢复之前的值
				}
			}
			else{
				uartS("\n$err:unkown mode");
			}
		}	
			
		//6个数码管的闪-灭要同步（即如果有2个数码管闪，则它们应该同灭和同亮）。
		disp_x.cnt_seg++;
		if(disp_x.cnt_seg> disp_x.max_seg){
			disp_x.cnt_seg= 0;
			
			for(int i=0; i< 6; i++){
				disp_x.sta[i]= !disp_x.sta[i];
			}
		}

		
		
		/*9个发光二级管的闪-灭独立，不同步。
		!!不同于DT45的直接控制，新增了LED的闪。
		*/
		uint16_t led_data;	//临时变量
		led_data= disp_x.data_nc[7];
		led_data<<= 8;
		led_data|= disp_x.data_nc[6];
		
		for(int i=0; i< 9; i++){
			if(DISP_X_MODE_ON == disp_x.led[i].mode){
				//led_data|= (1<< i);	
			}
			else if(DISP_X_MODE_OFF == disp_x.led[i].mode){		
				//led_data&= ~(1<< i);		
			}
			else if(DISP_X_MODE_FF == disp_x.led[i].mode){		//快闪
				if(led_data&(1<< i)){
					if(disp_x.led[i].sta){
						led_data|= (1<< i);
					}
					else{
						led_data&= ~(1<< i);		//恢复之前的值
					}
				}
			}
			else if(DISP_X_MODE_LF == disp_x.led[i].mode){		//慢闪
				if(led_data&(1<< i)){
					if(disp_x.led[i].sta){
						led_data|= (1<< i);
					}
					else{
						led_data&= ~(1<< i);		//恢复之前的值
					}
				}
			}
			else{
				uartS("\n$err:unkown mode");
			}
			
			disp_x.data[7]= led_data>> 8;
			disp_x.data[6]= (uint8_t)led_data;
			
			
			//9个LED的闪-灭不需同步。
			disp_x.led[i].cnt++;
			if(disp_x.led[i].cnt> disp_x.led[i].max){
				disp_x.led[i].cnt= 0;
						
				disp_x.led[i].sta= !disp_x.led[i].sta;
			}
		}

		
		//使用disp_x.data[]，更新CH423S的寄存器。
		if(-1 != ch423s_update(disp_x.data)){
			uartS("X");
		}
		
		
		osDelay(50);		//闪烁的计时单位：50ms。
	}
}



/*所有数码管、指示灯亮。
*/
static void x_disp_8(void)
{
    ch423s_set(CMD_WR_DIG0, DAT_8, DOT_EN);		//显示小数点
    ch423s_set(CMD_WR_DIG1, DAT_8, DOT_EN);		//不显示小数点
    ch423s_set(CMD_WR_DIG2, DAT_8, DOT_EN);
    ch423s_set(CMD_WR_DIG3, DAT_8, DOT_EN);
    ch423s_set(CMD_WR_DIG4, DAT_8, DOT_EN);
    ch423s_set(CMD_WR_DIG5, DAT_8, DOT_EN);
	
    ch423s_set(CMD_WR_DIG6, DAT_8, DOT_EN);
}


/*所有数码管、指示灯亮。
*/
static void x_disp_blank(void)
{
    ch423s_set(CMD_WR_DIG0, DAT_BLANK, DOT_DIS);		//显示小数点
    ch423s_set(CMD_WR_DIG1, DAT_BLANK, DOT_DIS);		//不显示小数点
    ch423s_set(CMD_WR_DIG2, DAT_BLANK, DOT_DIS);
    ch423s_set(CMD_WR_DIG3, DAT_BLANK, DOT_DIS);
    ch423s_set(CMD_WR_DIG4, DAT_BLANK, DOT_DIS);
    ch423s_set(CMD_WR_DIG5, DAT_BLANK, DOT_DIS);
	
    ch423s_set(CMD_WR_DIG6, DAT_BLANK, DOT_DIS);
}



/*
#define DAT_F			0x71		//'F'
#define DAT_o			0x5C		//'o'
#define DAT_r			0x50		//'r'
#define DAT_C			0x39		//'C'
#define DAT_E			0x79		//'E'
*/
static void x_disp_logo(void)
{
    ch423s_set(CMD_WR_DIG0, DAT_0, DOT_DIS);		//显示小数点
    ch423s_set(CMD_WR_DIG1, DAT_F, DOT_DIS);		//不显示小数点
    ch423s_set(CMD_WR_DIG2, DAT_o, DOT_DIS);
    ch423s_set(CMD_WR_DIG3, DAT_r, DOT_DIS);
    ch423s_set(CMD_WR_DIG4, DAT_C, DOT_DIS);
    ch423s_set(CMD_WR_DIG5, DAT_E, DOT_DIS);
	
    ch423s_set(CMD_WR_DIG6, DAT_BLANK, DOT_DIS);
}



/*上电后的固定显示流程。
*/
static void x_disp_pwr(void)
{
	for(int i= 0; i< 3; i++){
		
		x_disp_8();
		osDelay(250);
		
		x_disp_blank();
		osDelay(250);
	}
	
	buz_beep(100);
	x_disp_logo();
	osDelay(1000);
}








